package com.lxw.question;

public class Q06 {
    /**
     * 题目描述
     * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
     *
     * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
     *
     * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/add-two-numbers
     *
     */

    /**
     * 注意：失败的方法
     * @param l1
     * @param l2
     * @return
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        long val1 = (long)getNumber(l1);
        long val2 = (long)getNumber(l2);
        long result = val1 + val2;
        System.out.println("相加的结果是:"+result);
        ListNode resultList = generateListNode(result);
        return resultList;
    }

    /**
     * 用于提取链表中数字的方法
     */
    public static double getNumber(ListNode l){
        double number = 0;
        //遍历链表取得值

        number = l.val;

        double zeroNum = 0;
        while(l.next != null){
            zeroNum++;
            l = l.next;
            //排除位数可能为零的情况，这时如果乘以零是不可以的
            if(l.val == 0){
                continue;
            } else{
                number = number + Math.pow(10.0,zeroNum) * (l.val == 0 ? 1 : l.val);
            }

        }
        System.out.println("得到的数为:"+number);
        return (int)number;
    }

    public static ListNode generateListNode(long number){
        //生成头节点
        ListNode cur = null;
        int val = (int)number%10;
        number = number / 10;
        ListNode headNode = new ListNode(val);
        cur = headNode;

        while(number >= 1){
            val = (int)number%10;
            number = number / 10;

            ListNode newNode = new ListNode(val);
            cur.next = newNode;
            newNode.next = null;
            cur = newNode;

        }
        return headNode;
    }

    public static void traverseList(ListNode l){
        while(l != null){
            System.out.print(l.val + " ");
            l = l.next;
        }
    }


    public static void main(String[] args){
        //[9]
        //[1,9,9,9,9,9,9,9,9,9]
        ListNode l1 = generateListNode(9);
        ListNode l2 = generateListNode(9999999991l);
        ListNode resultList = addTwoNumbers(l1,l2);
        traverseList(resultList);
    }


}
